<?php

namespace models\negocio;

use Doctrine,
    Doctrine\ORM\Query,
    Doctrine\ORM\EntityManager,
    models\entidades\Entidade;

class BaseBLL {
    protected $em;
    protected $nomeEntidade;
    private static $namespaceEntidade = "models\\entidades\\";

    public function __construct(){
        $this->em = Doctrine::$ems;
    }

    public function incluir(Entidade $entidade){
        $this->em->persist($entidade);
    }

    public function remover(Entidade $entidade){
        //$entidade->setExcluido(true);
        $this->em->remove($entidade);
    }

    public function removerPorId($id){
        $entidade = $this->buscarPorId($id);
        $this->em->remove($entidade);
    }
    
    public function buscarTodos(){
        return $this->em->getRepository($this->nomeEntidade)->findAll();
    }

    public function buscarPorId($id){
        return $this->em->find($this->nomeEntidade, $id);
    }

    protected function ConsultarTodos($nomeEntidade, $ordem = null)
    {
        return $this->Consultar($nomeEntidade, null, $ordem);
    }

    protected function Consultar($nomeEntidade, $condicao = null, $ordem = null)
    {
        if(!is_null($condicao))
        {
            $condicao = " WHERE ".$condicao;
        }
        if(!is_null($ordem))
        {
            $ordem = " ORDER BY ".$ordem;
        }

        $query = $this->em->createQuery("SELECT e FROM " . $this->NomeEntidade($nomeEntidade) . " e $condicao $ordem");
        
        return $query->getResult(Query::HYDRATE_OBJECT);
    }

    protected function Query($query, $quantidade = null)
    {
        $query = $this->em->createQuery($query);

        if(!is_null($quantidade))
        {
            $query->setMaxResults($quantidade);
        }

        return $query->getResult(Query::HYDRATE_OBJECT);
    }

    protected function QueryUnico($query)
    {
        $query = $this->em->createQuery($query);
        return $query->getSingleResult(Query::HYDRATE_OBJECT);
    }

    protected function QueryUnicoEscalar($query)
    {
        $query = $this->em->createQuery($query);
        return $query->getSingleScalarResult();
    }

    public function commit(){
        $this->em->flush();
    }

    protected function NomeEntidade($nomeEntidade)
    {
        return BaseBLL::$namespaceEntidade . $nomeEntidade;
    } 
}